<?php
// 应用公共文件

use app\admin\model\Config as ConfigModel;

// 常量
define('SUPERADMIN_ROLE_ID', 1);    // 超级管理员角色ID
define('PASSWORD_LENGTH_MIN', 8);   // 密码最小长度

/**
 * 公共函数：密码加密
 * 注意：password_hash函数生成的hash长度60位，请确保数据库中密码字段有足够长度
 * @param string $password 密码明文
 * @return string
 */
function ibms_password_hash(string $password)
{
    return '' == $password ?: password_hash($password, PASSWORD_DEFAULT);
}

/**
 * 公共函数：密码校验
 * @param string $password 密码明文
 * @param string $hash     密码哈希
 * @return bool
 */
function ibms_password_verify(string $password, string $hash)
{
    return password_verify($password, $hash);
}

/**
 * 公共函数：系统默认密码(读取配置错误则默认为12345678)
 * @return bool
 */
function ibms_default_password()
{
    $default_password = ConfigModel::getValueByName('default_password');

    return ibms_password_hash(is_null($default_password) ? '12345678' : $default_password);
}

/**
 * 公共函数：生成Tree结构数据，方便以json发送到前台(多级菜单、区域代码等)
 * @param array  $dataList 数据数组
 * @param string $sonName  子项名称
 * @return array
 */
function generateTree(array $dataList, string $sonName = 'children')
{
    $data = [];
    $tree = [];

    foreach ($dataList as $v) {
        $data[$v['id']] = $v;
    }

    foreach ($data as $k => $item) {
        if (isset($data[$item['pid']])) {
            $data[$item['pid']][$sonName][] = &$data[$k];
        } else {
            $tree[] = &$data[$k];
        }
    }

    return $tree;
}

/**
 * 公共函数：格式化菜单列表，菜单管理表格以及选择框使用
 * @param array $menuList 菜单列表数组
 * @param int   $pid      父级菜单ID
 * @param int   $indent   缩进级别
 * @return array
 */
function formatMenu(array $menuList = [], int $pid = 0, int $indent = 0)
{
    static $data = [];

    foreach ($menuList as $v) {
        if ($pid != $v['pid']) {
            continue;
        }

        // 格式化缩进和前缀
        $v['indent'] = str_repeat('&emsp;&emsp;', $indent) .'|--&ensp;';

        // 保存到数组
        $data[] = $v;

        // 递归
        formatMenu($menuList, $v['id'], $indent + 1);
    }

    return $data;
}

/**
 * 公共函数： 检测是否为超级管理员
 * @return bool
 */
function is_superadmin()
{
    return SUPERADMIN_ROLE_ID === session('admin_info')['role_id'];
}

/**
 * 公共函数： 检测权限标识
 * @param string $flag 权限标识
 * @return bool
 */
function has_permission(string $flag)
{
    // 超级管理员不受限制
    return is_superadmin() || in_array($flag, session('admin_flag'));
}

/**
 * 公共函数： 检测变量是否为手机号
 * @param string $string
 * @return bool
 */
function is_mobile(string $string)
{
    return 1 === preg_match('/^1[3-9]\d{9}$/', $string);
}

/**
 * 公共函数：是否为邮箱
 * @param string $string
 * @return bool
 */
function is_email(string $string)
{
    return false !== filter_var($string, FILTER_VALIDATE_EMAIL);
}
